FUNCTION MODULE ZSTB_INSERT_TRANSF_TBL
FUNCTION GROUP  ZSTB_FUNCTION_GROUP
DESCRIPTION     insert data into transfert table
PROCESSING TYPE : normal function module

IMPORT
PARAMETER       |TYPE_SPEC|ASSOCIATED_TYPE        |DEFAULT|OPTIONAL|PASS_VALUE|DESCRIPTION            
----------------|---------|-----------------------|-------|--------|----------|-----------------------
NUMBERFIELDS    |TYPE     |INT4                   |       |NO      |NO        |number of fields in row
DATAROW         |TYPE     |ANY                    |       |NO      |NO        |data row               
STRING_DELIMITER|TYPE     |ZSTB_STRING_DELIM_TYPE |       |NO      |NO        |CSV string delimiter   
FIELD_SEPARATOR |TYPE     |ZSTB_FIELD_SEP_TYPE    |       |NO      |NO        |CSV field separator    
SESSION_ID      |TYPE     |ZSTB_SESSION_ID_TYPE   |       |NO      |NO        |session ID             
REQUEST_UUID    |TYPE     |ZSTB_REQUEST_UUID_TYPE |       |NO      |NO        |request UUID           
FETCH_NUMBER    |TYPE     |ZSTB_FETCH_NUMBER_TYPE |       |NO      |NO        |fetch number           
LINE_NUMBER     |TYPE     |ZSTB_LINE_NUMBER_TYPE  |       |NO      |NO        |line number            
ROW_SEPARATOR   |TYPE     |ZSTB_ROW_SEPARATOR_TYPE|       |NO      |NO        |row separator          

SOURCE CODE
...........
function zstb_insert_transf_tbl .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(NUMBERFIELDS) TYPE  INT4
*"     REFERENCE(DATAROW) TYPE  ANY
*"     REFERENCE(STRING_DELIMITER) TYPE  ZSTB_STRING_DELIM_TYPE
*"     REFERENCE(FIELD_SEPARATOR) TYPE  ZSTB_FIELD_SEP_TYPE
*"     REFERENCE(SESSION_ID) TYPE  ZSTB_SESSION_ID_TYPE
*"     REFERENCE(REQUEST_UUID) TYPE  ZSTB_REQUEST_UUID_TYPE
*"     REFERENCE(FETCH_NUMBER) TYPE  ZSTB_FETCH_NUMBER_TYPE
*"     REFERENCE(LINE_NUMBER) TYPE  ZSTB_LINE_NUMBER_TYPE
*"     REFERENCE(ROW_SEPARATOR) TYPE  ZSTB_ROW_SEPARATOR_TYPE
*"----------------------------------------------------------------------

data: datafieldstring type string,
  stringdelimiterreplacement type string,
  returnrowstring type string,
  transfert_line type zstb_transfert_struc,
  remaining_data_length type i,
  max_chunk_size type i value 255,
  chunk_size type i,
  chunk_start_index type i,
  line_part_number type i,
  line_data(255) type c,
  datafieldstring_length type i,
  datafieldstring_lastcharpos type i,
  datafieldstring_lastchar type string, " WARNING : C(1) type does not manage space
  datafieldstring_lastchartest type string.
field-symbols: <datafield> type any.

* initialize CSV delimiters
stringdelimiterreplacement = ''.
concatenate string_delimiter string_delimiter into  stringdelimiterreplacement.

* convert line to CSV
returnrowstring = ''.
do numberfields times.
* convert field to string
  assign component sy-index of structure datarow to <datafield>.
  datafieldstring = <datafield>.
* SAP 'smartly' add trailing space, so we delete them
* this is an ugly ad-hoc right trim, make it a function if you need it else were
* i did not found a better way to make it, pleas accept my apologies
  datafieldstring_length = strlen( datafieldstring ).
  if datafieldstring_length > 0.
    datafieldstring_lastcharpos = datafieldstring_length - 1.
    datafieldstring_lastchar = datafieldstring+datafieldstring_lastcharpos(1).
    concatenate '¤' datafieldstring_lastchar '¤' into datafieldstring_lastchartest.
    while datafieldstring_length > 0 and datafieldstring_lastchartest = '¤ ¤'.
      datafieldstring = datafieldstring+0(datafieldstring_lastcharpos).
      if datafieldstring_length > 0.
        datafieldstring_length = strlen( datafieldstring ).
        datafieldstring_lastcharpos = datafieldstring_length - 1.
        datafieldstring_lastchar = datafieldstring+datafieldstring_lastcharpos(1).
        concatenate '¤' datafieldstring_lastchar '¤' into datafieldstring_lastchartest.
      endif.
    endwhile.
  endif.
* manage fields containing delimiters
  replace all occurrences of string_delimiter in datafieldstring with stringdelimiterreplacement.
  if datafieldstring ca field_separator or datafieldstring ca string_delimiter or datafieldstring ca row_separator.
    concatenate string_delimiter  datafieldstring  string_delimiter into  datafieldstring.
  endif.
* concatenate string fields into CSV line
  if sy-index > 1.
    concatenate returnrowstring field_separator datafieldstring into returnrowstring.
  else.
    concatenate returnrowstring datafieldstring into returnrowstring.
  endif.
enddo.

* initialize line keys
transfert_line-session_id = session_id.
transfert_line-request_uuid = request_uuid.
transfert_line-fetch_number = fetch_number.
transfert_line-line_number = line_number.

* chunk complete data line as many times as needed
line_part_number = 0.
remaining_data_length = strlen( returnrowstring ).
chunk_start_index = 0.
chunk_size = max_chunk_size.
while chunk_size = max_chunk_size.
* compute chunk size
  if chunk_size > remaining_data_length.
    chunk_size = remaining_data_length.
  endif.
* chunk line
  line_data = returnrowstring+chunk_start_index(chunk_size).
  transfert_line-line_part_number = line_part_number.
  transfert_line-line_data = line_data.
  insert into zstb_transf_tbl values transfert_line.
* next line partition
  if chunk_size = max_chunk_size.
    remaining_data_length = remaining_data_length - chunk_size.
    chunk_start_index = chunk_start_index + chunk_size.
    line_part_number = line_part_number + 1.
  endif.
endwhile.

endfunction.